package dhee;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;

public class MemoryTestPane extends JPanel implements ActionListener {

	/**
	 * 方块类数组
	 */
	private Block[] block;

	/**
	 * 图标数组
	 */
	private ImageIcon[] icon;

	/**
	 * 添加方块对象用的链表
	 */
	private LinkedList<Block> blockList;

	/**
	 * 添加图标对象用的链表
	 */
	private LinkedList<ImageIcon> iconList;

	/**
	 * 判断是否成功变量
	 */
	private int success;

	/**
	 * 计时
	 */
	private int time;

	/**
	 * 计时器对象
	 */
	private Timer timer;

	/**
	 * 显示时间用的文本框
	 */
	private JTextField showTime;

	/**
	 * 判断计时器是否启动
	 */
	private boolean timerIsStart = false;

	/**
	 * 测试区域的列数
	 */
	private int x = 0;

	/**
	 * 测试区域的行数
	 */
	private int y = 0;

	/**
	 * 构造器
	 */
	public MemoryTestPane(Block[] block, ImageIcon[] icon, int x, int y) {
		this.block = block;
		this.icon = icon;
		this.x = x;
		this.y = y;
		// 初始化方块链表
		blockList = new LinkedList<>();
		// 初始化图标链表
		iconList = new LinkedList<>();
		// 设置布局管理器
		setLayout(new BorderLayout());
		// 初始化中部容器
		JPanel center = new JPanel();
		// 设置中部容器为网格布局
		center.setLayout(new GridLayout(y, x));
		// 遍历方块到中部容器内,并添加监听
		for (int i = 0; i < block.length; i++) {
			center.add(block[i]);
			block[i].addActionListener(this);
		}
		// 初始化下部容器
		JPanel south = new JPanel();
		// 初始化用时文本框
		showTime = new JTextField(10);
		// 设置文本框不可编辑
		showTime.setEditable(false);
		// 设置文本框字体颜色
		showTime.setForeground(Color.red);
		// 设置文本框居中
		showTime.setHorizontalAlignment(JTextField.CENTER);
		// 添加用时文本框到下部容器
		south.add(showTime);
		// 添加中部、下部容器 并定位
		add(center, BorderLayout.CENTER);
		add(south, BorderLayout.SOUTH);
		// 随机生成图标
		randomSetIcons(block, icon);
		// 初始化计时器
		timer = new Timer(1000, this);
	}

	/**
	 * 事件监听
	 */
	public void actionPerformed(ActionEvent e) {
		// 如果事件源是Block类
		if (e.getSource() instanceof Block) {
			// 方块缓存 给到翻开图标变量
			Block blockTemp = (Block) e.getSource();
			ImageIcon openedIcon = blockTemp.getOpenedIcon();
			// 如果图标链表为空
			if (iconList.size() == 0) {
				// 将翻开的图标添加到图标链表
				iconList.add(openedIcon);
				// 将方块缓存添加到方块链表
				blockList.add(blockTemp);
				// 已找到的方块数置1
				success = 1;
			} else {
				// 图标链表 给到图标缓存变量
				ImageIcon iconTemp = iconList.getLast();
				// 如果当前打开的图标和已打开的图标相同
				if (iconTemp == openedIcon && !blockList.contains(blockTemp)) {
					// 已找到的方块数自增
					success++;
					// 将翻开的图标添加到链表
					iconList.add(openedIcon);
					blockList.add(blockTemp);
					// 如果已找到的图标等于该等级设定的成功数量
					if (success == x) {
						for (int i = 0; i < this.block.length; i++) {
							// 设置所有方块不响应
							this.block[i].setEnabled(false);
						}
						// 计时器停止
						timer.stop();
						// 将用时传给显示成绩的对话框
						new ShowRecord(time);
					}
				} // 如果当前打开的图标和已打开的图标不相同
				else if (iconTemp != openedIcon) {
					// 清空方块和图标链表
					iconList.clear();
					blockList.clear();
					// 将翻开的图标添加到链表
					iconList.add(openedIcon);
					blockList.add(blockTemp);
					// 已找到的方块数置1
					success = 1;
					// 遍历方块数组
					for (int i = 0; i < block.length; i++) {
						// 如果方块缓存不等于当前遍历到的方块
						if (blockTemp != block[i]) {
							// 当前遍历到的方块的图标置空
							block[i].setIcon((ImageIcon) null);
						}
					}
				}
			}
			// 如果计时器没有启动
			if (!timerIsStart) {
				// 计时器归零
				time = 0;
				// 启动计时器
				timer.start();
				// 将判断计时器是否启动的变量设为真
				timerIsStart = true;
			}
		}
		// 如果事件源是计时器
		if (e.getSource() == timer) {
			// 用时加1
			time++;
			// 更新用时文本框
			showTime.setText("您的用时" + time + "秒");
		}
	}

	/**
	 * 随机生成图标
	 */
	public void randomSetIcons(Block[] block, ImageIcon[] icon) {
		// 创建list集合用于存放图标下标
		List<Integer> list = new ArrayList<Integer>();
		// 遍历方块
		for (int i = 0; i < block.length; i++) {
			// 方块下标和图标个数取模存入集合
			int x = i % icon.length;
			list.add(x);
		}
		// 遍历方块
		for (int i = 0; i < block.length; i++) {
			// 创建随机数
			int m = (int) (Math.random() * list.size());
			// 用随机数从集合中取下标
			int x = list.get(m);
			// 将图标设置到方块中
			block[i].setOpenedIcon(icon[x]);
			// 从集合中删除所使用的随机数位置的下标
			list.remove(m);
		}
	}
}
